-- 优惠券id
local voucherId = ARGV[1]
-- 用户id
local userId = ARGV[2]
-- 订单id
local orderId = ARGV[3]

-- 优惠券库存key
local voucherKey = "seckill:stock:" .. voucherId
-- 优惠券订单key
local orderKey = "seckill:order:" .. voucherId

-- 库存不足
if(tonumber(redis.call('get', voucherKey)) <= 0) then
    return 1
end

-- 用户重复购买
if(redis.call('sismember', orderKey, userId) == 1) then
    return 2
end

-- 库存和一人一单校验均通过
-- 库存减1
redis.call('incrby', voucherKey, -1)
-- 将用户id添加到已购买该优惠券的集合
redis.call('sadd', orderKey, userId)
-- 将下单数据保存到消息队列中，这里为什么orderId的键写成id=>方便将数据取出并用BeanUtil填充到VoucherOrder这个类
redis.call('xadd', 'stream.orders', '*', 'userId', userId, 'voucherId', voucherId, 'id', orderId)
-- 返回0表示购买成功
return 0
